#include "OneSecProcess.h"
#include "globalDef.h"
#include "tim_hw.h"
#include "peripheral.h"
#include "L610.h"
#include "CarMonitor.h"
#include "Flash_user.h"
#include "SPI_Flash.h"
#include "algorithm.h"
#include "string.h"
#include "CarMonitor.h"
#include "storeCarInf.h"
#include "IAP.h"


UTC_typedef		tagUTC = {0};

#if _EnCntTimes_def
extern u32 CntTimes;
#endif

/*
秒相关的事情可以放在这里
*/
//uint8_t test_time = 0;
//uint8_t buffer[13] = {0x00,0x00,0x03,0xE9,0x00,0x51,0x00,0x00,0x01,0x2C,0x00,0x52,0x01};
//extern	uint32_t set_car_Health(uint8_t* da , uint8_t len);

void OneSecProcess(void)
{
	if (getSecFlag() == 0x01)
	{
		
		#if _EnCntTimes_def
		printf("CntTimes = %d", CntTimes);
		CntTimes  = 0;
		#endif

		clearSecFlag();
		//下面部分每秒被执行1次
		
		//定时存储车辆参数
		regularCheckSaveCarInf();
		
		//内部的秒增加
		L610SecInc();
		
		//查车辆状态相关秒处理函数
		carMonitorSecDeal();
		
		//每秒变量加1，每30秒存储到Flash1次
		secIncAndStoreUTC();
		
		//关于低电压自动断电L610,1秒钟采样1次，求10次的平均值
		carVoltageMonitor();
		
		//系统上电后延时发送MCU版本号到L610
		sendMcuVersionToL610();
		
		//test_time++;
		//if( test_time >= 10 )
		//{
		//	test_time = 0;
		//	set_car_Health( buffer,13 );
		//}
		#if 0
		//测试在不同主频下运行
		{
			static uint8_t changeSec = 0;
			static uint8_t PrtOnce = 0;
			
			changeSec++;
			
			if (changeSec >= 20)
			{
				changeSec = 0;
				setRunIn120MHz();	
				if (PrtOnce != 0x55)
				{
					PrtOnce = 0x55;
					printf("Run In 120M\r\n");	
				}
			}
			else if (changeSec >= 10)
			{
				setRunIn8MHz();	
				if (PrtOnce != 0x66)
				{
					PrtOnce = 0x66;
					printf("Run In 8M\r\n");
				}
				
			}
		}
		#endif
		
		//测试秒
		#if 0
		{
			static uint32_t testCnt = 0;
			printf("sec = %d,\r\n", testCnt++);			
		}
		#endif
		
	}
	
	//毫秒测试
	#if 0
		{
			static uint32_t testCntMs = 0;
			static uint16_t oldMs = 0;
			uint16_t newMs;
			
			newMs = get1msCounter();
			if (getTim1MsElaps(newMs, oldMs) >= _MS(500))
			{
				oldMs = newMs;
				printf("ms = %d\r\n", testCntMs++);
			}
		}
		#endif
}







/*把UTC时间相关的放在这里
*/
uint32_t writeUTC(uint32_t utcTime)
{
//	uint8_t i;
//	uint8_t wrDa[8];
//	uint8_t rdDa[8];
	
	//定时存入Flash
	tagUTC.g_utcTime = utcTime;
	
//	wrDa[0] = 0xF1;
//	u32toHex4(utcTime, &wrDa[1]);
//	wrDa[5] = get_chk_xor(&wrDa[1], 4);
//	
//	//判断地址越界
//	if ( (tagUTC.adrNew > FlashAddrOfUTCEnd) ||
//		(tagUTC.adrNew < FlashAddrOfUTC) )
//	{
//		tagUTC.adrNew = FlashAddrOfUTC;
//		Flash_Erase(Sector_Erase,tagUTC.adrNew);
//	}
//	
//	//写3次防止意外故障，比如静电干扰
//	for(i=0;i<3;i++)
//	{
//		Flash_Write_Data(tagUTC.adrNew, wrDa, 6);
//		Flash_Read_Data(tagUTC.adrNew, rdDa, 6);
//		
//		tagUTC.adrNew += 8;
//		if (tagUTC.adrNew >= FlashAddrOfUTCEnd-8)
//		{
//			tagUTC.adrNew = FlashAddrOfUTC;
//		}
//		
//		if ((tagUTC.adrNew % 0x1000) == 0)
//		{
//			Flash_Erase(Sector_Erase,tagUTC.adrNew);
//		}
//		
//		if (memcmp(wrDa, rdDa, 6) == 0)
//		{
//			break;
//		}
//	}
	
	return 0;
	
}

//获取UTC时间，用于给L610应答
uint32_t getCurrnetUtc(void)
{
	return tagUTC.g_utcTime;
}

////从Flash读取, 开机只读取1次
//uint32_t readUTCFromFlash(void)
//{
//	uint32_t adr;
//	uint32_t utc = 0;
//	uint8_t rdDa[16];
//	
//	
//	for(adr = FlashAddrOfUTC; adr < FlashAddrOfUTCEnd-8; adr += 8)
//	{
//		Flash_Read_Data(adr, rdDa, 9);
//		
//		if ( (rdDa[0] == 0xF1) &&
//				(rdDa[8] == 0xFF) &&
//				(0x00 == get_chk_xor(rdDa+1, 5)) )
//		{
//			utc = hex4CombineOne(&rdDa[1]);
//			tagUTC.adrNew = adr + 8;
//			break;
//		}
//	}
//	
//	//说明空白存储器，直接存第一条位置
//	if (adr >= FlashAddrOfUTCEnd-8)
//	{
//		tagUTC.adrNew = FlashAddrOfUTC;
//		Flash_Erase(Sector_Erase,tagUTC.adrNew);
//	}
//	
//	tagUTC.g_utcTime = utc;
//	
//	return 0;
//}

//每秒变量加1，每30秒存储到Flash1次
void secIncAndStoreUTC(void)
{
		tagUTC.g_utcTime ++;
//		if ((tagUTC.g_utcTime % 30) == 29)
//		{
//			writeUTC(tagUTC.g_utcTime);
//		}	
	
}







